﻿/**
 * 快捷菜单
 * 针对链接、目录、图片有快捷操作菜单
 */
(function(E, $){
var Consts = E.consts, Menu = E.mod("Menu"), Event = E.mod("Event");

// 链接快捷菜单
Menu.add('mouseup', {
	title: '链接快捷菜单',
	check: function( cursorElement ){
		var bool = false;
		if ( cursorElement && (typeof cursorElement === 'object') ){
			if( $.nodeName(cursorElement, 'A') ){
				bool = true;
			}
		}
		return bool;
	},
	
	getHtml: function( cursorElement ){
		var html = [], o = $(cursorElement),
		text = o.text(), url, href = o.attr('href');
		
		html.push('<a name="ShortcutMenu" method="unlink" title="将链接转为纯文本">取消链接(Esc)</a>');
		if( href ){
			if( /^http:\/\/www\.(hudong|baike)\.com\/wiki\//.test(href)
				|| o.hasClass('baikelink')
				|| o.hasClass('innerlink')
			){
				url = 'http://www.baike.com/wiki/'+encodeURI(text);
			}else{
				url = href;
			}
		
			html.push('<a href="'+url+'" title="'+url+'" target="_blank" name="ShortcutMenu" method="openlink">打开链接</a>');
		}
		return {className:'jqe-shortcut-menu', html:html.join(' ')};
	}
});

//=========================================================


// 目录快捷菜单
Menu.add('mouseup', {
	title: '目录快捷菜单',
	
	check: function( cursorElement ){
		var bool = false;
		if ( cursorElement && (typeof cursorElement === 'object') ){
			if( $.nodeName(cursorElement, 'H2') || $.nodeName(cursorElement, 'H3') ){
				bool = true;
			}
		}
		return bool;
	},
	
	getHtml: function( cursorElement ){
		var html = [];
		html.push('<a name="ShortcutMenu" method="totext">取消目录(Esc)</a> <a name="ShortcutMenu" method="remove">删除目录</a>');
		return {className:'jqe-shortcut-menu', html:html.join('')};
	}
});


//=========================================================

// 注意：方法return true 后菜单会隐藏，否则不隐藏
E.plugin("ShortcutMenu", {
	isNeedPanel:0,
	config: {
		isAllowImageCenter: true,
		
		// 如果是百科词条编辑，仅需要“大 小”两个选项
		isBaikeWiki:false
	},
	// 
	// target 点击的快捷菜单的对象，下同
	click: function( Menu, self, target ){
		var bool= false, el = Event.getTarget(), method = target.attr('method');
		
		if( self[method] ){
			bool = self[method]( el, target );
		}else{
			alert('提示：快捷菜单方法名称错误！');
			
		}
		return bool;
	},
	
	// 转为文字
	totext: function(el){
		var text = $(el).text(), dom = E.get('document');
		$(el, dom).replaceWith( text );
		return true;
	},
	
	// 取消链接
	unlink: function(el){
		var html = $(el).html(), dom = E.get('document');
		$(el, dom).replaceWith( html );
		return true;
	},
	
	// 删除
	remove: function(el){
		el.parentNode.removeChild(el);
		return true;
	},
	
	// 表格操作
	table: function(el, target){
		var name = target.attr('plugin'), plugin = E.plugin(name);
		
		// 返回值false时不隐藏菜单，方便重复操作
		return plugin.click();
	},
	
	openlink: function( ){
		return true;
	},
	//删除参考资料
	removeRefer : function(el){
		el.parentNode.removeChild(el);
		return true;
	},
	//编辑参考资料
	editRefer : function(el, target) {
		var plugin = E.plugin(target.attr('plugin'));
		plugin.editor_callback(el.getAttribute('name'), plugin);
		return true;
	}
});

//=========================================================


// 图片快捷菜单
Menu.add('mouseup', {
	title: '图片快捷菜单',
	
	check: function( cursorElement){
		var bool = false;
		if ( cursorElement && (typeof cursorElement === 'object') ){
			if( $.nodeName(cursorElement, 'IMG') ){
				bool = true;
			}
		}
		return bool;
	},
	getHtml: function( cursorElement ){
		var html = [],is_hdong_img = /a\d\.att\.(hudong|baike)\.com/i.test(cursorElement.src);
		html.push('<span>尺寸：');
		if(is_hdong_img){
			// 如果是百科词条编辑，仅需要“大 小”两个选项
			if( E.plugin('ShortcutMenu').config.isBaikeWiki ){
				html.push('<a name="ShortcutMenu-Image" method="resize" param="_s">大</a>');
				html.push('<a name="ShortcutMenu-Image" method="resize" param="_140">小</a>');
			}else{
				html.push('<a name="ShortcutMenu-Image" method="resize" param="_950">大</a>');
				html.push('<a name="ShortcutMenu-Image" method="resize" param="_s">中</a>');
				html.push('<a name="ShortcutMenu-Image" method="resize" param="_140">小</a>');
			}
		}else{
			html.push('大 中 小 ');
		}
		html.push('</span>');
		
		html.push('<span>位置：');
		html.push('<a name="ShortcutMenu-Image" method="align" param="left">居左</a>');
		if( E.plugin('ShortcutMenu').config.isAllowImageCenter ){
			html.push('<a name="ShortcutMenu-Image" method="align" param="center">居中</a>');
		}
		html.push('<a name="ShortcutMenu-Image" method="align" param="right">居右</a>');
		html.push('</span>');
		html.push('<br />');
		
		html.push('<span><a name="ShortcutMenu-Image" method="desc">添加描述</a></span>|');
		html.push('<span><a name="ShortcutMenu-Image" method="remove">删除</a></span>');
		
		return {className:'jqe-shortcut-menu', html:html.join('')};
	},
	
	callback: function( menu){
		var el = Event.getTarget(),
			parentNode = $(el).closest('div.img'),//div
			selected_size = null,
			selected_align = null,
			align_list = {'left': 'img_l', 'center': 'img_c', 'right': 'img_r'},
			size_list = ['_950', '_s', '_140'],
			selected_css = {'color': '#333333','cursor': 'default','text-decoration': 'none'};
			//判断最外层是否有DIV标签
		if(parentNode.length) {
			//判断是否有img样式类
			if(parentNode.attr('class').indexOf('img') > -1) {
				var class_value = parentNode.attr('class');
				//判断是否有控制位置的类
				for(var key in align_list) {
					var item = align_list[key];
					if(class_value.indexOf(item) > -1) {
						selected_align = key;
						break;
					}
				}
				if(selected_align) {
					var align_obj = menu.find('[param='+selected_align+']');
					align_obj.css(selected_css).removeAttr('method').removeAttr('name');
				}
				//是否存在描述标签，并且内容不为空
				var disc_obj = parentNode.find('strong');
				if(disc_obj.length > 0 && $.trim(disc_obj.text()) ) {
					disc_obj = menu.find('[method=desc]');
					disc_obj.css(selected_css).removeAttr('method').removeAttr('name');
				}
			}
		}
		//是互动的图片
		if(/a\d\.att\.(hudong|baike)\.com/i.test(el.src)) {
			var img_src = el.src;
			for(var i = 0; i < size_list.length ; i++) {
				var item = size_list[i];
				if(img_src.indexOf(item) > -1) {
					var size_obj = menu.find('[param='+item+']');
					size_obj.css(selected_css).removeAttr('method').removeAttr('name');
					break;
				}
			}
		}
	}
});


// 表格快捷菜单
// 表格快捷菜单优先级低于链接和图片等快捷菜单
// 所以要最后添加
/* // 暂时去掉表格左键快捷菜单 2012-11-16
Menu.add('mouseup', {
	title: '表格快捷菜单',
	
	// 显示超时，默认这个时间之后菜单自动隐藏
	timeout: 3000,
	
	check: function( cursorElement, e ){
		var bool = false;
		
		// 右键点击不要出现快捷菜单
		if(  e.button === 2 ){
			return bool;
		}
		
		if ( cursorElement && (typeof cursorElement === 'object') ){
			if( E.$(cursorElement).closest("tr").size() ){
				bool = true;
			}
		}
		return bool;
	},
	
	getHtml: function( cursorElement ){
		var html = [];
		html.push('<span><b title="单元格水平对齐方式">水平</b>：<a name="ShortcutMenu" method="table" plugin="SetCellAlignLeft" title="单元格居左对齐">居左</a><a name="ShortcutMenu" method="table" plugin="SetCellAlignCenter" title="单元格居中对齐">居中</a><a name="ShortcutMenu" method="table" plugin="SetCellAlignRight" title="单元格居右对齐">居右</a></span>');
		
		html.push('&nbsp;<span><b title="单元格垂直对齐方式">垂直</b>：<a name="ShortcutMenu" method="table" plugin="SetColumnValignTop" title="单元格垂直居顶对齐">居顶</a><a name="ShortcutMenu" method="table" plugin="SetColumnValignCenter" title="单元格垂直居中对齐">居中</a></span>');
		
		html.push('<br /><span><b title="调整单元格宽度">宽度</b>：<a name="ShortcutMenu" method="table" plugin="SetCellWidthAdd10" title="单元格宽度加10">加10</a><a name="ShortcutMenu" method="table" plugin="SetCellWidthReduce10" title="单元格宽度减10">减10</a><a name="ShortcutMenu" method="table" plugin="SetCellWidthAdd50" title="单元格宽度加50">加50</a><a name="ShortcutMenu" method="table" plugin="SetCellWidthReduce50" title="单元格宽度减50">减50</a></span>&nbsp;&nbsp;&nbsp;&nbsp;<span title="更多功能，请在单元格处右键点击" style="color:#666;cursor:default;">更多...</span>');
		
	//	html.push('<span><b title="插入行或列">插入</b>：<a name="ShortcutMenu" method="table" plugin="RowInsertBefore" title="向上插入一行">向上</a><a name="ShortcutMenu" method="table" plugin="RowInsertAfter" title="向下插入一行">向下</a><a name="ShortcutMenu" method="table" plugin="ColumnInsertBefore" title="向左插入一列">向左</a><a name="ShortcutMenu" method="table" plugin="ColumnInsertAfter" title="向右插入一列">向右</a></span>');
		
	//	html.push('<br /><span><b title="删除表格/行/列">删除</b>：<a name="ShortcutMenu" method="table" plugin="RemoveTable" title="删除整个表格">表格</a><a name="ShortcutMenu" method="table" plugin="RemoveRow" title="删除一行">一行</a><a name="ShortcutMenu" method="table" plugin="RemoveColumn" title="删除一列">一列</a></span>');
		
	//	html.push('<span><b title="上下移动行">移动</b>：<a name="ShortcutMenu" method="table" plugin="RowMoveBefore" title="向上移动一行">上移</a><a name="ShortcutMenu" method="table" plugin="RowMoveAfter" title="向下移动一行">下移</a></span>');

		return {className:'jqe-shortcut-menu', html:html.join('')};
	}
});
*/


E.plugin("ShortcutMenu-Image", {
	style : '.ShortcutMenu-Image-selected{color:#333333;cursor:default;font-weight:bold;text-decoration:none;}',
	click: function( Menu, self, target ){
		var el = Event.getTarget(),
			method = target.attr('method'),
			param = target.attr('param'),
			bool = false;
		if(method) {
			if( self[method] ){
				bool = self[method]( el, param, target );
			}else{
				alert('提示：快捷菜单方法名称错误！');
			}

		}
		return bool;
	},
	
	// 调整图片尺寸
	resize: function(el, param){
		Util.update_img(el, param, 'resize');
		return true;
	},
	
	// 调整图片对齐方式
	align: function(el, param){
		Util.update_img(el, param, 'align');
		return true;
	},
	
	// 图片添加描述
	desc: function(el, param, target){
		var parentNode = $(el).closest('div.img'),
			align_class = '';
		if(parentNode.length) {
			align_class = parentNode.attr('class');
			if(align_class.indexOf('img_l') > -1){
				align_class = 'left';
			}else if(align_class.indexOf('img_c') > -1) {
				align_class = 'center';
			}else if(align_class.indexOf('img_r') > -1) {
				align_class = 'right';
			}
		}
		Util.update_img(el, align_class, 'desc');
		return true;
	},
	
	// 删除
	remove: function(el){
		var remove_obj = $(el);
		if(remove_obj.closest('div.img').length){
			remove_obj = remove_obj.closest('div.img');
		}else if(remove_obj.closest('a').length){
			remove_obj = remove_obj.closest('a');
		}
		remove_obj.remove();
		return true;
	}
});

var Util = {
	/*
		el : 图片节点
		param : 参数【对齐方式或者大小】
		action : 标志操作类型[resize:大小，align：对齐方式，desc ：添加描述]
	*/
	update_img : function(el, param, action){
		var max_width= 600,
			img_obj = $(el),
			img_width = img_obj.width(),
			align_list = {'left': 'img_l', 'center': 'img_c', 'right': 'img_r'},
			title = '',
			new_src = '';
		
		//判断是否是站点图片
		if(action=='resize' && /a\d\.att\.(hudong|baike)\.com/i.test(img_obj.attr('src'))){
			new_src = img_obj.attr('src').replace(/_140|_s|_950/i, param);
			img_obj.attr('src',new_src);
			var tmp_img = new Image();
			tmp_img.onload = function(){
				img_obj.attr('width',tmp_img.width);
				update_view(tmp_img.width);
			};
			tmp_img.src = new_src;
		}else {
			update_view();
		}
		function update_view(new_width){
			//这里需要在后面获取src值
			var link = img_obj.attr('src'),
				align_class = align_list[param] ? align_list[param]: 'img_c';//默认值img_c;跟大小操作无关，所以可以在这里赋值
			if(typeof new_width == 'number') {
				img_width = new_width;
			}
			//图片宽度超过最大值这加width属性
			if(img_width > max_width) {
				img_width = max_width;
				img_obj.width = img_width;
			}
			//外层有a标签则将a标签和img标签看陈一个整体
			if(img_obj.closest('a').length) {
				img_obj = img_obj.closest('a');
			}
			var parentNode = img_obj.closest('div.img');//div
			//img_obj外面有div.img标签情况
			if(parentNode.length) {
				if(action =='resize') {
					parentNode.width(img_width).find('img').width(img_width);
				}else {
					parentNode.removeClass('img_l img_c img_r').addClass(align_class);
				}
			}else {
				parentNode = E.$('<div class="img '+align_class+'" style="width:'+img_width+'px"></div>').append(img_obj.clone());
				img_obj.replaceWith(parentNode);
			}
			
			if(action == 'desc'){
				if( img_obj.attr('title') ){
					title = img_obj.attr('title');
				}else if( img_obj.attr('alt') ){
					title = img_obj.attr('alt');
				} else {
					title = '图片描述';
				}
				
				if( parentNode.find('strong').length ){
					parentNode.find('strong').text(title);
				}else{
					parentNode.append('<strong>'+title+'</strong>');
				}
			}else{
				//删除描述strong标签style属性，该属性中的width会导致图片大小缩放是文字不居中
				parentNode.find('strong').removeAttr('style');
			}
		}
	}
}



})(jQEditor, jQuery);
